import vm from '@/main'
import common from '@/utils/common'
let stringValidate = (rule,value,callback) => { // 非必填字符串
  // 字符串不验证
  callback()
}
let stringRequiredValidate = (rule,value,callback) => { // 必填字符串
  if(value===''){
    return callback(new Error(vm.$t('m.enter')))
  }
  // 字符串不验证
  callback()
}
let stringRequiredFixedTypeValidate = (rule,value,callback) => { // 必填字符串(仅限['生产日期','到期日期','入库日期']之一)
  let regExp = new RegExp(/^(\d{4})-(\d{2})-(\d{2})/)
  if(value===''){
    return callback(new Error(vm.$t('m.enter')))
  } else if(!regExp.test(value)){
    return callback(new Error(vm.$t('m.dateFormat')))
  }
  // 字符串不验证
  callback()
}
let numberValidate = (rule,value,callback) => { // 非必填数值
  if(isNaN(value)){
    return callback(new Error(`${vm.$t('m.enter')}${vm.$t('m.check.number')}`))
  }
  callback()
}
let numberRequiredValidate = (rule,value,callback) => { // 必填数值
  if(value===''){
    return callback(new Error(vm.$t('m.enter')))
  } else if(isNaN(value)){
    return callback(new Error(`${vm.$t('m.enter')}${vm.$t('m.check.number')}`))
  }
  callback()
}
let dateValidate = (rule,value,callback) => { // 非必填日期
  // 日期不验证
  callback()
}
let dateRequiredValidate = (rule,value,callback) => { // 必填日期
  // 日期不验证
  if(value===''){
    return callback(new Error(vm.$t('m.choose')))
  }
  callback()
}
let dateTimeValidate = (rule,value,callback) => { // 非必填日期时间
  // 日期时间不验证
  callback()
}
let dateTimeRequiredValidate = (rule,value,callback) => { // 必填日期时间
  // 日期时间不验证
  if(value===''){
    return callback(new Error(vm.$t('m.choose')))
  }
  callback()
}
let batchattrValidate = {
  stringRequiredValidate:[{ validator:stringRequiredValidate}],
  stringValidate:[{ validator:stringValidate}],
  stringRequiredFixedTypeValidate:[{ validator:stringRequiredFixedTypeValidate }],
  numberValidate:[{ type:'number', validator:numberValidate}],
  numberRequiredValidate:[{ type:'number', validator:numberRequiredValidate}],
  dateValidate:[{ type:'date', validator:dateValidate}],
  dateRequiredValidate:[{ type:'date', validator:dateRequiredValidate}],
  dateTimeValidate:[{ type:'date', validator:dateTimeValidate}],
  dateTimeRequiredValidate:[{ validator:dateTimeRequiredValidate}]
}
let timeFn = {
  // 验证日期，并进行推算（生产日期倒推到期日期，到期日期倒推生产日期）
  handleDate(scopeIndex,index,targetDate){
    let todayTimestamp = new Date(`${common.timestampSimple(new Date())} 00:00:00`).getTime() // 今天的时间戳(返回yyyy-MM-dd 00:00:00的时间戳)
    let expirationnum = this.detail.expirationnum // 离生产日期还有expirationnum日过期（保质期）
    // 禁收天数 = 保质期 * 禁收比例
    // 如果保质期（expirationnum = 0）为0，禁收天数肯定也是0
    let limitationofreceipt = expirationnum?this.detail.limitationofreceipt:0 // 禁收limitationofreceipt日（禁收天数）
    let millisecond = 24 * 3600 * 1000 // 1天等于86400000毫秒

    let productionTimestamp = 0, expiryTimestamp = 0
    let limitationoTimestamp = limitationofreceipt?todayTimestamp - millisecond * limitationofreceipt:0 // 禁收日期的时间
    if(this.tableDetail.tableData[scopeIndex].batchattr[index].label==='生产日期'){
      productionTimestamp = targetDate // 生产日期的时间戳
      if(expirationnum&&targetDate){
        expiryTimestamp = targetDate + millisecond * (expirationnum - 1) // 到期日期的时间戳
        if(expiryTimestamp<todayTimestamp){ // 到期日期不能小于今天
          this.$set(this.tableDetail.tableData[scopeIndex].batchattr[index],'value','')
          let result = this.tableDetail.tableData[scopeIndex].batchattr.find((item)=>item.label==='到期日期')
          this.$set(result,'value','')
          return this.callbackMessage(`${this.$t('m.sigin.forbidden2')}`)
        }
        if (productionTimestamp >= limitationoTimestamp){ // 生产日期大于等于禁收日期，才能通过
          let result = this.tableDetail.tableData[scopeIndex].batchattr.find((item)=>item.label==='到期日期'&&item.enable)
          if(result){
            // 到期日期
            let expirydate = `${common.timestampSimple(expiryTimestamp)}${this.tableDetail.tableData[scopeIndex].batchattr[index].format>=3?' 23:59:59':''}`
            this.$set(result,'value',expirydate)
          }
        }
      }
    } else if(this.tableDetail.tableData[scopeIndex].batchattr[index].label==='到期日期'){
      expiryTimestamp = targetDate + millisecond - 1 // 到期日期的时间戳
      if(expirationnum&&targetDate){
        productionTimestamp = targetDate - millisecond * (expirationnum - 1) // 生产日期的时间戳
        if(productionTimestamp>todayTimestamp){ // 生产日期不能大于今天
          this.$set(this.tableDetail.tableData[scopeIndex].batchattr[index],'value','')
          let result = this.tableDetail.tableData[scopeIndex].batchattr.find((item)=>item.label==='生产日期')
          this.$set(result,'value','')
          return this.callbackMessage(`${this.$t('m.sigin.forbidden1')}`)
        }
        if (productionTimestamp >= limitationoTimestamp){ // 生产日期大于等于禁收日期，才能通过
          // 设置到期日期为targetDate（targetDate = 选中日期+1天-1秒）
          this.$set(this.tableDetail.tableData[scopeIndex].batchattr[index],'value',common.timestampToTime(targetDate+millisecond-1))
          let result = this.tableDetail.tableData[scopeIndex].batchattr.find((item)=>item.label==='生产日期'&&item.enable)
          if(result){
            let productiondate = `${common.timestampSimple(productionTimestamp)}${this.tableDetail.tableData[scopeIndex].batchattr[index].format>=3?' 00:00:00':''}` // 生产日期
            this.$set(result,'value',productiondate)
          }
        }
      }
    }
    if (productionTimestamp < limitationoTimestamp){ // 生产日期小于禁收日期，全部置空
      if(targetDate) this.callbackMessage(this.$t('m.sigin.overdate')) // 此商品已过禁收期
      this.$set(this.tableDetail.tableData[scopeIndex].batchattr[index],'value','') // 生产日期or到期日期置空
      let result = this.tableDetail.tableData[scopeIndex].batchattr[index].label==='生产日期'?
        this.tableDetail.tableData[scopeIndex].batchattr.find((item)=>item.label==='到期日期'):
        this.tableDetail.tableData[scopeIndex].batchattr.find((item)=>item.label==='生产日期')
      if(result) this.$set(result,'value','')
    }
  },
  // 输入日期后触发的event
  inputTime(scopeIndex,index){
    // 单独针对生产日期和到期日期进行处理
    let handleType = ['生产日期','到期日期']
    if(handleType.includes(this.tableDetail.tableData[scopeIndex].batchattr[index].label)){
      let targetDate = this.timeToTimestamp(this.tableDetail.tableData[scopeIndex].batchattr[index].value) // 当前录入时间戳（生产日期or到期日期）
      if(isNaN(targetDate)){
        this.callbackMessage(this.$t('m.sigin.dateValidate'))
        this.$set(this.tableDetail.tableData[scopeIndex].batchattr[index],'value','') // 生产日期or到期日期置空
        // 存在保质期的情况下，才会清空
        let expirationnum = this.detail.expirationnum // 保质期
        if(expirationnum){
          let result = this.tableDetail.tableData[scopeIndex].batchattr[index].label==='生产日期'?
            this.tableDetail.tableData[scopeIndex].batchattr.find((item)=>item.label==='到期日期'):
            this.tableDetail.tableData[scopeIndex].batchattr.find((item)=>item.label==='生产日期')
          if(result) this.$set(result,'value','')
          return
        }
      }
      this.handleDate(scopeIndex,index,targetDate)
    }
  },
  // 选择日期后触发的event
  pickTime(scopeIndex,index){
    // 单独针对生产日期和到期日期进行处理
    let handleType = ['生产日期','到期日期']
    if(handleType.includes(this.tableDetail.tableData[scopeIndex].batchattr[index].label)){
      let targetDate = this.timeToTimestamp(this.tableDetail.tableData[scopeIndex].batchattr[index].value) // 当前录入时间戳（生产日期or到期日期）
      let todayTimestamp = new Date(`${common.timestampSimple(new Date())} 00:00:00`).getTime() // 今天的时间戳(返回yyyy-MM-dd 00:00:00的时间戳)
      if(this.tableDetail.tableData[scopeIndex].batchattr[index].label==='生产日期'){
        if(todayTimestamp<targetDate){ // 生产日期不能大于今天
          this.callbackMessage(`${this.$t('m.sigin.forbidden1')}`)
          this.$set(this.tableDetail.tableData[scopeIndex].batchattr[index],'value','')
          // 存在保质期的情况下，才会清空
          let expirationnum = this.detail.expirationnum // 保质期
          if(expirationnum){
            let result = this.tableDetail.tableData[scopeIndex].batchattr.find((item)=>item.label==='到期日期')
            if(result) this.$set(result,'value','') // 如果存在到期日期，一起置空
            return
          }
        }
      } else {
        if(targetDate&&todayTimestamp>targetDate){ // 到期日期不能小于今天
          this.callbackMessage(`${this.$t('m.sigin.forbidden2')}`)
          this.$set(this.tableDetail.tableData[scopeIndex].batchattr[index],'value','')
          // 存在保质期的情况下，才会清空
          let expirationnum = this.detail.expirationnum // 保质期
          if(expirationnum){
            let result = this.tableDetail.tableData[scopeIndex].batchattr.find((item)=>item.label==='生产日期')
            if(result) this.$set(result,'value','') // 如果存在生产日期，一起置空
            return
          }
        }
      }
      this.handleDate(scopeIndex,index,targetDate)
    }
  },
  timeToTimestamp(time){
    let timestamp = new Date(time).getTime()
    return timestamp
  }
}
export {batchattrValidate,timeFn}